package com.itheima.service.impl;

import com.itheima.dao.AccountDao;
import com.itheima.domain.Account;
import com.itheima.service.AccountService;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;

import javax.sql.DataSource;
import java.util.List;

/**
 * @program: Spring_day01_01_IOC入门程序
 * @description: 发现个问题，xml注入的时候，也要有set方法吗？
 * 当有多个不同的方法需要实现切入时，只需要修改expression="execution(* *..transfer(..))"/>？？？？
 * @author: xuejingjing
 * @create: 2021-07-25 11:54
 **/
public class AccountServiceImpl implements AccountService {

    private AccountDao accountDao;

    //放到到通知中了，这里就不需要了
   // private DataSource dataSource;

    public void setAccountDao(AccountDao accountDao) {
        this.accountDao = accountDao;
    }

//    public void setDataSource(DataSource dataSource) {
//        this.dataSource = dataSource;
//    }

    /**
     * 转账操作
     *
     * @param outName 出账用户名
     * @param inName  入账用户名
     * @param money   转账金额
     */
    public void transfer(String outName, String inName, Double money) {

        //问题出在，各自是一个独立的事务。应该看成一个事务，这个操作要么全成功，要么全失败。
        //spring提供的都是业务层事务。

        //这两个接口对应的都是数据层，他们有自己对应的事务。所以需要在业务层合并为一个事务。
//       把这两个操作放到统一的事务中。
//        PlatformTransactionManager platformTransactionManager

        //开启事务
        //1,先拿到平台事务管理器
//        PlatformTransactionManager ptm = new DataSourceTransactionManager(dataSource);
//        //事务定义
//        TransactionDefinition td = new DefaultTransactionDefinition();
//        //事务状态
//        TransactionStatus ts = ptm.getTransaction(td);
//
        accountDao.inMoney(outName,money);
        int i = 1/0;
        accountDao.outMoney(inName,money);
//
//        //提交事务
//        ptm.commit(ts);

    }
}
